// 引入模块
var fs = require('fs');
var ejs = require('ejs');
var mysql4 = require('mysql4');
var express = require('express');
var bodyParser = require('body-parser');
var session = require('express-session'); 
var cors = require('cors');
var app = express();

// 允许所有域名访问
app.use(cors());

// 连接MySQL数据库
var connection = mysql4.createConnection({
    host: '127.0.0.1',
    port: "3306",
    user: 'root',
    password: '123456',
    database: 'Library'
});
// 判断数据库是否连接成功
connection.connect(function(err){
    // 判断连接数据库时是否发生错误
    if(err){
        // 如果有错误，打印出错误信息
        console.log('存在问题:'+err);
        return;
    }
    // 如果没有发生错误，打印连接成功的信息
    console.log('MySQL数据库连接成功!');
});

// 创建服务器
var app = express();
app.use(bodyParser.urlencoded({
    extended: false
}));

// 注册中间件的函数。中间件是在 Express 中处理请求和响应的函数。
app.use(session({
    secret: 'your_secret_key', // 使用一个安全的密钥
    resave: false,
    saveUninitialized: true
}));

// 启动服务器
app.listen(52273, function () {
    console.log('服务器运行在 http://127.0.0.1:52273/');
});

// 简单的会话管理中间件示例
function ensureAuthenticated(req, res, next) {
    // 检查会话中是否存在 isAuthenticated 属性且其值为 true
    if (req.session.isAuthenticated) {
        // 如果用户已经通过认证，则调用 next() 函数，将请求传递给下一个中间件或路由处理函数
        return next();
    } else {
        // 如果用户未通过认证，则使用 res.redirect() 方法将用户重定向到登录页面
        res.redirect('/login');
    }
}

// 登录页面
app.get('/login', function (request, response) {
    // 读取模板文件
    fs.readFile('login.html', 'utf8', function (error, data) {
        if (error) {
            response.status(500).send('Error loading login page');
        } else {
            response.send(data);
        }
    });
});

// 登录验证
app.post('/login', function (req, res) { // 确保req作为参数传入
    var username = req.body.username;
    var password = req.body.password;

    // 执行SQL语句验证用户
    connection.query('SELECT * FROM users WHERE username = ? AND password = ?', [username, password], function (error, results) {
        if (error) {
            console.error(error);
            return res.status(500).send('Server error');
        }
        if (results.length > 0) {
            // 登录成功，设置会话
            req.session.isAuthenticated = true;
            req.session.username = username;
            res.redirect('/');
        } else {
            // 登录失败，返回登录页面并显示错误信息
            res.send('登录失败，请检查用户名和密码');
        }
    });
});

app.get('/', ensureAuthenticated, function (request, response) {
    fs.readFile('student-list.html', 'utf8', function (error, data) {
        if (error) {
            console.error(error);
            response.status(500).send('读取文件失败');
            return;
        }

        connection.query('SELECT * FROM student', function (error, results) {
            if (error) {
                console.error(error);
                response.status(500).send('数据库查询失败');
                return;
            }

            let renderedData = ejs.render(data, { data: results });
            // 设置Content-Type为text/html，并指定编码为utf8（可根据实际情况调整编码）
            response.setHeader('Content-Type', 'text/html; charset=utf8');
            response.send(renderedData);
        });
    });
});

// ... 其他路由保持不变，但都需要添加 ensureAuthenticated 中间件来确保用户已经登录

// ... 其他路由保持不变，但都需要添加 ensureAuthenticated 中间件来确保用户已经登录

// ... 其他路由保持不变，但都需要添加 ensureAuthenticated 中间件来确保用户已经登录
//删除数据
app.get('/delete/:id', function (request, response) {
    // 执行SQL语句
    connection.query('DELETE FROM student WHERE id=?', [request.params.id], function () {
        // 响应信息
        response.redirect('/');
    });
});

app.get('/insert', function (request, response) {
    // 读取模板文件
    fs.readFile('student-insert.html', 'utf8', function (error, data) {
        // 响应信息
        response.send(data);
    });
});
//添加数据
app.post('/insert', function (request, response) {
    // 声明body
    var body = request.body;
    // 执行SQL语句
    connection.query('INSERT INTO student (student_name, studentid, sex) VALUES (?, ?, ?)', [
        body.student_name, body.studentid, body.sex
    ], function () {
        // 响应信息
        response.redirect('/');
    });
});
//查询数据
app.get('/edit/:id', function (request, response) {
    // 读取模板文件
    fs.readFile('student-edit.html', 'utf8', function (error, data) {
        // 执行SQL语句
        connection.query('SELECT * FROM student WHERE id = ?', [
            request.params.id
        ], function (error, result) {
            // 响应信息
            response.send(ejs.render(data, {
                data: result[0]
            }));
        });
    });
});
//修改数据
app.post('/edit/:id', function (request, response) {
    // 声明body
    var body = request.body;
    // 执行SQL语句
    connection.query('UPDATE student SET student_name=?, studentid=?, sex=? WHERE id=?', [body.student_name, body.studentid, body.sex, request.params.id], function () {
        // 响应信息
        response.redirect('/');
    });
});
// 注册验证及插入数据
app.post('/register', function (req, res) {
    var username = req.body.username;
    var password = req.body.password;

    // 简单验证用户名和密码不为空，你可添加更复杂验证规则，比如长度限制等
    if (!username ||!password) {
        return res.status(400).send('用户名和密码不能为空');
    }

    // 检查用户名是否已存在（执行SQL查询），这里示例查询逻辑，实际中可优化性能等
    connection.query('SELECT * FROM users WHERE username =?', [username], function (error, results) {
        if (error) {
            console.error(error);
            return res.status(500).send('Server error');
        }
        if (results.length > 0) {
            // 用户名已存在，返回提示信息
            return res.send('用户名已存在，请更换用户名');
        }

        // 用户名不存在，执行插入操作
        connection.query('INSERT INTO users (username, password) VALUES (?,?)', [username, password], function (insertError) {
            if (insertError) {
                console.error(insertError);
                return res.status(500).send('注册失败，服务器错误');
            }
            // 注册成功，可根据需求设置提示信息或者重定向等，这里简单重定向到登录页面
            res.redirect('/login');
        });
    });
});
app.get('/register', function (request, response) {
    // 读取模板文件
    fs.readFile('register.html', 'utf8', function (error, data) {
        if (error) {
            response.status(500).send('Error loading login page');
        } else {
            response.send(data);
        }
    });
});